﻿// 截图.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <atlimage.h>
#include <windows.h>
#include <string>
#include <iomanip>
using namespace std;



bool SaveScreenshot(const wchar_t* filename, HWND hWnd = NULL) {
    CImage image;
    HDC hdc = GetDC(hWnd ? hWnd : GetDesktopWindow());
    image.Create(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), 24);
    BitBlt(image.GetDC(), 0, 0, image.GetWidth(), image.GetHeight(), hdc, 0, 0, SRCCOPY);
    image.Save(filename);
    ReleaseDC(hWnd, hdc);
    return true;
}
std::wstring GenerateGuidString() {
    GUID guid;
    HRESULT res= CoCreateGuid(&guid);

    wchar_t guidStr[40];
    int value=  StringFromGUID2(guid, guidStr, 40);  // 格式化为 "{550E8400-E29B-41D4-A716-446655440000}"

    // 移除首尾的 '{' 和 '}'
    return std::wstring(guidStr + 1, guidStr + 37);  // 结果为 "550E8400-E29B-41D4-A716-446655440000"
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
int main() {

    //SYSTEMTIME st;
    //std::wstring filename = L"Screenshot_" +
    //    std::to_wstring(st.wYear) +
    //    std::to_wstring(st.wMonth) +
    //    std::to_wstring(st.wDay) + L"_" +
    //    std::to_wstring(st.wHour) +
    //    std::to_wstring(st.wMinute) +
    //    std::to_wstring(st.wSecond) +
    //    L".png";
    wstring fileName = GenerateGuidString() + L".PNG";
    // 注册热键 (F11)
    RegisterHotKey(NULL, 1, 0, VK_F11);
    cout << "按F11" << endl;
    MSG msg;
    GetMessage(&msg, NULL, 0, 0);
    if (SaveScreenshot(fileName.c_str())){
        std::wcout << L"截图已保存为 screenshot.png" << std::endl;
    }
    else {
        std::wcerr << L"截图失败！" << std::endl;
    }
    return 0;
}
